package com.ctshk.rpc.ship.service;


import com.ctshk.common.dto.Result;
import com.ctshk.common.model.PageResponse;
import com.ctshk.common.model.TokenUser;
import com.ctshk.rpc.ship.dto.*;
import com.ctshk.rpc.ship.dto.app.ShipRouteDataDTO;
import com.ctshk.rpc.ship.dto.app.ShipWharfDto;
import com.ctshk.rpc.ship.req.*;
import com.ctshk.rpc.ship.req.app.AppShipProductIsRecommendedReq;
import com.ctshk.rpc.ship.req.app.PeoplesPriceDto;
import com.ctshk.rpc.ship.req.app.RouteReq;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 船票产品 服务类
 * </p>
 *
 * @author 谢诗宏
 * @since 2021-03-05
 */
public interface IAppShipProductService {


    /**
     * 新增船票产品信息
     *
     * @param shipProductReq
     * @param user
     */
    Result saveShipProduct(ShipProductReq shipProductReq, TokenUser user);


    /**
     * 分页查询船票产品列表
     *
     * @param shipProductPageReq
     * @return
     */
    PageResponse<ShipProductDTO> queryList(ShipProductPageReq shipProductPageReq,TokenUser tokenUser);

    /**
     * 查询船票产品详细
     *
     * @param id)
     * @return
     */
    ShipProductDetailDTO queryDetail(Long id);

    /**
     * 修改时查询船票产品详细
     *
     * @param id)
     * @return
     */
    ShipProductViewDetailDTO queryProductDetail(Long id);


    /**
     * 修改审核不通过船票产品
     */
    Result updateUnapprovedShipProduct(ShipProductReq shipProductReq, TokenUser user);

    /**
     * 修改审核通过信德船票产品
     */
    Result updateApprovedXDShipProduct(ShipProductReq shipProductReq, TokenUser user);

    /**
     * 修改审核通过珠江船票产品
     */
    Result updateApprovedZJShipProduct(ShipProductReq shipProductReq, TokenUser user);

    /**
     * 新增-编辑提交审批
     *
     * @param submitReq
     * @param user
     */
    Result submit(SubmitReq submitReq, TokenUser user);


    /**
     * 查询船票推荐产品列表
     *
     * @return
     */
    List<ShipRecommendListDTO> queryRecommendList(TokenUser user);

    /**
     * 查询船票预订产品列表
     *
     * @param shipProductIsRecommendedReq
     * @param channelId
     * @param productId
     * @return
     */
    List<ShipReserveListDTO> queryReserveList(AppShipProductIsRecommendedReq shipProductIsRecommendedReq, Long channelId, String productId);
    /**
     * 查询船票外挂品列表
     *
     * @param shipProductManualReq
     * @return
     */
    List<ShipReserveListDTO> queryManualList(ShipProductManualReq shipProductManualReq);

    /**
     * 查询船票规则信息
     *
     * @param id
     * @return
     */
    ShipProductReservationSettingsDTO getShipProductReservationSettingsById(Long id);

    /**
     * 根据线下自营的ID查找自营的数据
     *
     * @param id
     * @return
     */
    ShipProductChannelOfflineSelfCustomItemDTO queryOfflineSelfById(Long id);

    List<ShipProductCostAndDateListDTO> queryShipProductCostAndDateList(Long productId, LocalDate date,String userId);

    List<ShipReserveDTO> queryOfflineSelfList(Long productId,LocalDate localDate);

    ShipInitializationSettingsDTO queryShipInitializationSettings();

    /**
     * 查询珠江船舶接口单程数据
     * @param shipZJProductIsRecommendedReq
     * @return
     */
    List<ShipReserveListDTO> queryApiProductList(ShipZJProductIsRecommendedReq shipZJProductIsRecommendedReq);
    /**
     * 查询珠江船舶接口往返数据
     * @param shipZJProductApiReq
     * @param user
     * @return
     */
    List<ShipApiProductTypeListDTO> queryApiProductGoAndBackList(ShipZJProductApiReq shipZJProductApiReq, TokenUser user);

    /**
     * 查询珠江船舶產品
     * @param productId
     * @return
     */
    List<ShipReserveListDTO> queryApiProductList(String productId,int ticketNumber);

    Result saveShipBooking(ShipProductReq shipProductReq, TokenUser user);

    Result updateSetting(ShipProductUpdateSettingReq shipProductUpdateSettingReq);

    Result updateApiSetting(ShipProductUpdateApiSettingReq shipProductUpdateApiSettingReq);

    Result<ShipProductUpdateApiSettingDTO> queryApiSetting(Long id);

    /**
     * 产品编辑操作
     * @param shipProductReq
     * @param user
     * @return
     */
    Result update(ShipProductReq shipProductReq, TokenUser user);


    /**
     * 分页查询船票产品列表
     *
     * @param shipProductPageReq
     * @return
     */
    PageResponse<ShipProductDTO> queryShipList(ShipProductPageReq shipProductPageReq);

    /**
     * 根据产品ID获取产品
     * @param shipProductPageReq
     * @return
     */
    List<ShipProductDTO> queryShipList2(ShipProductPageReq shipProductPageReq);

    /**
     * 更新審批狀態
     * @param shipProductCheckReq
     * @param currentUser
     * @return
     */
    Result<Long> check(ShipProductCheckReq shipProductCheckReq, TokenUser currentUser);

    /**
     * 预订中心-查询船票产品列表
     * @param shipProductSearchReq
     * @param user
     * @return
     */
    ReserveShipProductDto queryReserveNewList(ShipProductSearchReq shipProductSearchReq, TokenUser user);

    /**
     * 核对订单 - 查询代理商列表
     * @param req
     * @return
     */
    Result<PageResponse<AgentDto>> queryAgentList(AgentReq req);

    /**
     * 查询产品价格
     * @param shipPriceReq
     * @return
     */
    Result<Map<Integer,List<ShipBaseInfoDTO>>> queryShipPriceByDate(ShipPriceReq shipPriceReq);

    /**
     * 获取核对订单基本信息
     * @param shipReservationOrderReq
     * @return
     */
    List<ShipReservationGetOrderDTO> getOrderInfo(ShipReservationOrderReq shipReservationOrderReq);


    /**
     * 查询产品设置信息
     * @param id)
     * @return
     */
    ShipProductInfoDTO queryShipProductDetail(Long id);


    /**
     * 查询预订设置信息
     * @param id)
     * @return
     */
    ShipProductReserveInfoDTO queryShipProductReserveDetail(Long id);

    /**
     * 退还库存（弃用）
     * @param number  退还库存数
     * @param productId 产品ID
     * @param depTime 出发日期
     * @param reduce  还库存：false,减库存:true
     */
    void operateRepNumber(Integer number, Long productId, LocalDateTime depTime, boolean reduce);


    /**
     * 查询船票产品售价信息逻辑处理
     * @param strategyType 加幅类型，1：自营；2：代理；3：官方平台；4：第三方平台；
     * @param productId 产品ID
     * @param departureDate 出发日期
     * @param relId 关联ID，strategyType(1：用户ID；2：代理ID；3：渠道ID；4：渠道ID)
     * @return
     */
    ShipPriceRemainderDTO findShipSalePriceInfoHandle(int strategyType, Long productId, LocalDate departureDate, Long relId);


    /**
     * 获取产品所有旅客类型成本价
     * @param productId     产品ID
     * @param queryDate     查询日期
     * @return
     */
    List<PeoplesPriceDto> getPeoplesPrices(Long productId , LocalDate queryDate);

    /**
     * 初始化码头信息
     */
    Result<List<ShipWharfDto>> initRoute();

    /**
     * 查询码头信息
     * @param req
     * @return
     */
    List<ShipWharfDto> queryRouteInfo(RouteReq req);
}
